home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AppsToGo / Kibitz / Config.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-22  |  11.7 KB  |  469 lines  |  [TEXT/MPS ]

  1. /*
  2. ** Apple Macintosh Developer Technical Support
  3. **
  4. ** File:        config.c
  5. ** Written by:  Eric Soldan
  6. **
  7. ** Copyright © 1990-1992 Apple Computer, Inc.
  8. ** All rights reserved. */
  9.  
  10.  
  11.  
  12. /*****************************************************************************/
  13.  
  14.  
  15.  
  16. #include "Kibitz.h"                /* Get the Kibitz includes/typedefs, etc.    */
  17. #include "KibitzCommon.h"        /* Get the stuff in common with rez.        */
  18. #include "Kibitz.protos"        /* Get the prototypes for Kibitz.            */
  19.  
  20. #ifndef __PACKAGES__
  21. #include <Packages.h>
  22. #endif
  23.  
  24. #ifndef __RESOURCES__
  25. #include <Resources.h>
  26. #endif
  27.  
  28. #ifndef __TOOLUTILS__
  29. #include <ToolUtils.h>
  30. #endif
  31.  
  32. #ifndef __UTILITIES__
  33. #include <Utilities.h>
  34. #endif
  35.  
  36.  
  37.  
  38. /*****************************************************************************/
  39.  
  40.  
  41.  
  42. #define kConfigOK        1
  43. #define kConfigEquivs    2
  44. #define kConfigCancel    3
  45. #define kPlayWhite        4
  46. #define kPlayBlack        5
  47. #define kCompWhite        6
  48. #define kCompBlack        7
  49. #define kTimerToggle    8
  50. #define kDivider1        9
  51. #define kDivider2        10
  52. #define kDivider3        11
  53. #define kWhiteClock        12
  54. #define kBlackClock        13
  55. #define kStatText1        14
  56. #define kStatText2        15
  57. #define kStatText3        16
  58. #define kStatText4        17
  59. #define kStatText5        18
  60. #define kSpeech            20
  61.  
  62. static short    gOption;
  63.  
  64. static pascal Boolean    configFilter(DialogPtr dlg, EventRecord *event, short *item);
  65.  
  66.  
  67.  
  68. /*****************************************************************************/
  69.  
  70.  
  71.  
  72. static TheDoc    newConfig;
  73. static short    iconNum[3] = {rConfigBase, rConfigBase + 1, rConfigBase + 2};
  74.  
  75. pascal void        DoConfigureGameProc(DialogPtr dialog, short userItem);
  76.  
  77.  
  78.  
  79. /*****************************************************************************/
  80. /*****************************************************************************/
  81.  
  82. #ifdef applec
  83. #pragma segment Config
  84. #endif
  85.  
  86. /*****************************************************************************/
  87. /*****************************************************************************/
  88.  
  89.  
  90.  
  91. void    DoConfigureGame(FileRecHndl frHndl)
  92. {
  93.     WindowPtr        oldPort, window;
  94.     DialogPtr        dialog;
  95.     short            item, userItemType, i, val, part, option;
  96.     Handle            itemHndl;
  97.     Rect            userItemRect;
  98.     Str255            zone, machine, userName, timeStamp;
  99.     Point                    mouseLoc;
  100.     unsigned long            tick, timeInSecs;
  101.     long                    defaultTime, defaultMinutes;
  102.     Boolean                    colorChange, timeChange;
  103.     TheDocPtr                docPtr;
  104.     static    UserItemUPP        configureGameUPP = nil;
  105.     static    ModalFilterUPP    configFilterUPP = nil;
  106.  
  107.     oldPort = SetFilePort(frHndl);
  108.  
  109.     newConfig = (*frHndl)->doc;
  110.         /* So DoConfigureGameProc can know, too.  This also allows us to cancel,
  111.         ** without changes. */
  112.  
  113.     zone[0] = machine[0] = userName[0] = timeStamp[0] = 0;
  114.     colorChange = timeChange = 0;
  115.  
  116.     window = (*frHndl)->fileState.window;
  117.     dialog = GetCenteredDialog(rConfigureGame, nil, window, (WindowPtr)-1L);
  118.     if (dialog) {
  119.  
  120.         if (!SpeechAvailable())
  121.             HideDialogItem(dialog, kSpeech);
  122.  
  123.         for (item = kPlayWhite; item <= kSpeech; ++item) {
  124.             GetDialogItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  125.             val = 0;
  126.             switch (item) {
  127.                 case kPlayWhite:
  128.                 case kPlayBlack:
  129.                     if ((newConfig.myColor) == item - kPlayWhite) ++val;
  130.                     break;
  131.                 case kCompWhite:
  132.                     if (newConfig.compMovesWhite) ++val;
  133.                     break;
  134.                 case kCompBlack:
  135.                     if (newConfig.compMovesBlack) ++val;
  136.                     break;
  137.                 case kTimerToggle:
  138.                     if (newConfig.timeLeft[0] != -1) ++val;
  139.                     break;
  140.                 case kDivider1:
  141.                 case kDivider2:
  142.                 case kDivider3:
  143.                 case kWhiteClock:
  144.                 case kBlackClock:
  145.                     if (!configureGameUPP)
  146.                         configureGameUPP = NewUserItemProc (DoConfigureGameProc);
  147.                     itemHndl = (Handle)configureGameUPP;
  148.                     SetDialogItem(dialog, item, userItemType, itemHndl, &userItemRect);
  149.                     break;
  150.                 case kStatText3:
  151.                     pcpy(userName, &newConfig.opponentName[0]);
  152.                     pcpy(zone, &newConfig.opponentZone[0]);
  153.                     pcpy(machine, &newConfig.opponentMachine[0]);
  154.                     timeInSecs = newConfig.timeLastReceive;
  155.                     if (timeInSecs)
  156.                         IUTimeString(timeInSecs, false, timeStamp);
  157.                     break;
  158.                 case kSpeech:
  159.                     val = newConfig.doSpeech;
  160.                     break;
  161.             }
  162.  
  163.             if (val) SetControlValue((ControlHandle)itemHndl, val);
  164.         }
  165.  
  166.         ParamText(zone, machine, userName, timeStamp);
  167.         OutlineDialogItem(dialog, kConfigOK);
  168.  
  169.         for (option = 0;;) {
  170.  
  171.             SetPort(dialog);
  172.             if (!configFilterUPP)
  173.                 configFilterUPP = NewModalFilterProc (configFilter);
  174.             ModalDialog(configFilterUPP, &item);
  175.  
  176.             if (item == kConfigOK) {
  177.  
  178.                 docPtr = &((*frHndl)->doc);
  179.                 docPtr->compMovesWhite = newConfig.compMovesWhite;
  180.                 docPtr->compMovesBlack = newConfig.compMovesBlack;
  181.                     /* This is between us and us. */
  182.  
  183.                 docPtr->doSpeech = newConfig.doSpeech;
  184.  
  185.                 if (timeChange) {
  186.                     for (i = 0; i < 2; ++i) {
  187.                         if (option) {
  188.                             if (newConfig.timeLeft[i] == -1)
  189.                                 docPtr->freezeTime[i] = docPtr->timeLeft[i];
  190.                             else
  191.                                 newConfig.timeLeft[i] = docPtr->freezeTime[i];
  192.                         }
  193.                         else docPtr->freezeTime[i] = -1;
  194.                         docPtr->displayTime[i] = newConfig.defaultTime[i];
  195.                         docPtr->defaultTime[i] = newConfig.defaultTime[i];
  196.                         docPtr->timeLeft[i]    = newConfig.timeLeft[i];
  197.                     }
  198.                     (*frHndl)->doc.timerRefTick = TickCount();
  199.                     UpdateGameStatus(frHndl);
  200.                     SendMssg(frHndl, kTimeMssg);
  201.                     DrawTime(frHndl);
  202.                 }
  203.  
  204.                 if (colorChange)
  205.                     SendMssg(frHndl, newConfig.myColor);
  206.  
  207.                 break;
  208.             }
  209.  
  210.             if (item == kConfigCancel) break;
  211.  
  212.             GetDialogItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  213.             switch (item) {
  214.                 case kPlayWhite:
  215.                 case kPlayBlack:
  216.                     if (!GetControlValue((ControlHandle)itemHndl)) {
  217.                         colorChange = true;
  218.                         SetControlValue((ControlHandle)itemHndl, true);
  219.                         GetDialogItem(dialog, (kPlayWhite + kPlayBlack) - item,
  220.                                  &userItemType, &itemHndl, &userItemRect);
  221.                         SetControlValue((ControlHandle)itemHndl, false);
  222.                         newConfig.myColor ^= 1;
  223.                     }
  224.                     break;
  225.                 case kCompWhite:
  226.                 case kCompBlack:
  227.                     val = (GetControlValue((ControlHandle)itemHndl) ^ 1);
  228.                     SetControlValue((ControlHandle)itemHndl, val);
  229.                     if (item == kCompWhite)
  230.                         newConfig.compMovesWhite = val;
  231.                     else
  232.                         newConfig.compMovesBlack = val;
  233.                     break;
  234.                 case kTimerToggle:
  235.                     option = gOption;
  236.                     timeChange = true;
  237.                     val = (GetControlValue((ControlHandle)itemHndl) ^ 1);
  238.                     SetControlValue((ControlHandle)itemHndl, val);
  239.                     if (val) {
  240.                         for (i = 0; i < 2; ++i)
  241.                             newConfig.timeLeft[i] = newConfig.displayTime[i] =
  242.                                 newConfig.defaultTime[i];
  243.                     }
  244.                     else {
  245.                         for (i = 0; i < 2; ++i)
  246.                             newConfig.timeLeft[i] = -1;
  247.                     }                        
  248.                     for (item = kWhiteClock; item <= kBlackClock; ++item)
  249.                         DoConfigureGameProc(dialog, item);
  250.                     break;
  251.                 case kWhiteClock:
  252.                 case kBlackClock:
  253.                     if (newConfig.timeLeft[0] == -1) break;
  254.  
  255.                     userItemRect.right  -= 2;
  256.                     userItemRect.bottom -= 2;
  257.                         /* Don't include the drop shadow in hit area. */
  258.  
  259.                     part = 0;
  260.                     tick = TickCount();
  261.  
  262.                     GetMouse(&mouseLoc);
  263.                     if (PtInRect(mouseLoc, &userItemRect)) {
  264.                         if (mouseLoc.h < userItemRect.left + 16) {
  265.                             userItemRect.right = userItemRect.left + 16;
  266.                             part = 1;
  267.                         }
  268.                         else {
  269.                             if (mouseLoc.h > userItemRect.right - 16) {
  270.                                 userItemRect.left = userItemRect.right - 16;
  271.                                 part = 3;
  272.                             }
  273.                         }
  274.                         if (part) {
  275.                             if (mouseLoc.v > userItemRect.top + 12) {
  276.                                 ++part;
  277.                                 userItemRect.top += 12;
  278.                             }
  279.                             else
  280.                                 userItemRect.bottom = userItemRect.top + 12;
  281.                         }
  282.                     }
  283.                     if (!PtInRect(mouseLoc, &userItemRect)) part = 0;
  284.                         /* After calculating which rect we are supposed to be in,
  285.                         ** make sure we are actually in it.  (We might not be.) */
  286.  
  287.                     do {
  288.                         GetMouse(&mouseLoc);
  289.                         if (PtInRect(mouseLoc, &userItemRect)) {
  290.                             if (part) {
  291.                                 timeChange = true;
  292.                                 defaultTime = newConfig.defaultTime[item - kWhiteClock];
  293.                                 if (part >= 3) {
  294.                                     defaultMinutes = defaultTime;
  295.                                     defaultTime /= 216000L;
  296.                                     defaultTime *= 216000L;
  297.                                     defaultMinutes -= defaultTime;
  298.                                 }
  299.                             }
  300.                             switch (part) {
  301.                                 case 1:
  302.                                     iconNum[0] = rConfigBase + 3;
  303.                                     defaultTime += 216000L;
  304.                                     if (defaultTime >= (216000L * 4))
  305.                                         defaultTime -= (216000L * 4);
  306.                                     if (!defaultTime)
  307.                                         defaultTime = 216000L;
  308.                                     break;
  309.                                 case 2:
  310.                                     iconNum[0] = rConfigBase + 4;
  311.                                     defaultTime -= 216000L;
  312.                                     if (defaultTime < 0)
  313.                                         defaultTime += (216000L * 4);
  314.                                     if (!defaultTime)
  315.                                         defaultTime = (216000L * 3);
  316.                                     break;
  317.                                 case 3:
  318.                                     iconNum[2] = rConfigBase + 5;
  319.                                     defaultMinutes += 3600;
  320.                                     if (defaultMinutes >= 216000L)
  321.                                         defaultMinutes -= 216000L;
  322.                                     defaultTime += defaultMinutes;
  323.                                     if (!defaultTime)
  324.                                         defaultTime = 3600;
  325.                                     break;
  326.                                 case 4:
  327.                                     iconNum[2] = rConfigBase + 6;
  328.                                     defaultMinutes -= 3600;
  329.                                     if (defaultMinutes < 0)
  330.                                         defaultMinutes += 216000L;
  331.                                     defaultTime += defaultMinutes;
  332.                                     if (!defaultTime)
  333.                                         defaultTime = (216000L - 3600);
  334.                                     break;
  335.                             }
  336.                         }
  337.                         if (part) {
  338.                             newConfig.defaultTime[item - kWhiteClock] = defaultTime;
  339.                             for (i = 0; i < 2; ++i)
  340.                                 newConfig.timeLeft[i] = newConfig.displayTime[i] =
  341.                                     newConfig.defaultTime[i];
  342.                             DoConfigureGameProc(dialog, item);
  343.                             iconNum[0] = rConfigBase;
  344.                             iconNum[2] = rConfigBase + 2;
  345.                         }
  346.  
  347.                         while ((StillDown()) && (tick + 30 > TickCount())) {};
  348.                         tick += 3;
  349.  
  350.                     } while (StillDown());
  351.  
  352.                     DoConfigureGameProc(dialog, item);
  353.                     break;
  354.  
  355.                 case kSpeech:
  356.                     val = (GetControlValue((ControlHandle)itemHndl) ^ 1);
  357.                     SetControlValue((ControlHandle)itemHndl, val);
  358.                     newConfig.doSpeech = val;
  359.                     break;
  360.             }
  361.         }
  362.         DisposeDialog(dialog);
  363.     }
  364.  
  365.     SetPort(oldPort);
  366. }
  367.  
  368.  
  369.  
  370. /*****************************************************************************/
  371.  
  372.  
  373.  
  374. pascal void    DoConfigureGameProc(DialogPtr dialog, short userItem)
  375. {
  376.     short            userItemType;
  377.     Handle            userProc;
  378.     Rect            userItemRect;
  379.     Rect            clockRect;
  380.     short            i, time[3];
  381.     unsigned long    defaultTime;
  382.     Handle            clockPart;
  383.     RgnHandle        oldClip, newClip, textClip;
  384.     Str32            pstr;
  385.     Boolean            timed;
  386.  
  387.     GetDialogItem(dialog, userItem, &userItemType, &userProc, &userItemRect);
  388.     if (userItem < kWhiteClock) {
  389.         PenPat((ConstPatternParam)&qd.gray);
  390.         FrameRect(&userItemRect);
  391.         PenNormal();
  392.     }
  393.     else {
  394.         timed = (newConfig.timeLeft[0] != -1);
  395.  
  396.         oldClip = NewRgn();
  397.         GetClip(oldClip);
  398.         newClip = NewRgn();
  399.         RectRgn(newClip, &userItemRect);
  400.         SetRectRgn(textClip = NewRgn(),
  401.             userItemRect.left   + 16,
  402.             userItemRect.top    + 2,
  403.             userItemRect.right  - 19,
  404.             userItemRect.bottom - 4);
  405.         if (timed) DiffRgn(newClip, textClip, newClip);
  406.         SetClip(newClip);
  407.  
  408.         clockRect = userItemRect;
  409.         clockRect.right  = clockRect.left + 32;
  410.         clockRect.bottom = clockRect.top  + 32;
  411.         for (i = 0; i < 3; ++i) {
  412.             clockPart = GetResource('ICN#', iconNum[i]);
  413.             if (clockPart)
  414.                 PlotIcon(&clockRect, clockPart);
  415.             OffsetRect(&clockRect, 24, 0);
  416.         }
  417.  
  418.         if (timed) {
  419.             SetClip(textClip);
  420.             TextMode(srcCopy);
  421.             defaultTime = newConfig.defaultTime[userItem - kWhiteClock];
  422.             for (i = 3; i;) {
  423.                 defaultTime /= 60;
  424.                 time[--i] = defaultTime % 60;
  425.             }
  426.             for (i = 0; i < 2; ++i) {
  427.                 MoveTo(userItemRect.left + 21 + 20 * i, userItemRect.top + 15);
  428.                 pcpydec(pstr, time[i]);
  429.                 if (pstr[0] == 1) DrawChar('0');
  430.                 DrawString(pstr);
  431.                 DrawChar(": "[i]);
  432.             }
  433.             TextMode(srcOr);
  434.         }
  435.  
  436.         SetClip(oldClip);
  437.         DisposeRgn(oldClip);
  438.         DisposeRgn(newClip);
  439.         DisposeRgn(textClip);
  440.     }
  441. }
  442.  
  443.  
  444.  
  445. /*****************************************************************************/
  446.  
  447.  
  448.  
  449. pascal Boolean    configFilter(DialogPtr dlg, EventRecord *event, short *item)
  450. {
  451.     static unsigned long    lastIdle;
  452.  
  453.     gOption = (event->modifiers) & optionKey;
  454.  
  455.     if (KeyEquivFilter(dlg, event, item))
  456.         return(true);
  457.  
  458.     if (lastIdle + 30 < TickCount()) {
  459.         lastIdle = TickCount();
  460.         DoIdleTasks(false);
  461.         SetPort(dlg);
  462.     }
  463.  
  464.     return(false);
  465. }
  466.  
  467.  
  468.  
  469.